package org.ohos.rajawali3d.examples.examples.lights;

import ohos.agp.render.opengl.EGLConfig;
import ohos.agp.render.opengl.GLES1X;
import ohos.app.Context;
import org.ohos.rajawali3d.examples.examples.AExampleFragment;
import org.rajawali3d.renderer.ISurfaceRenderer;
import org.rajawali3d.util.GLU;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

public class TestFragment extends AExampleFragment {
    @Override
    public ISurfaceRenderer createRenderer() {
        return new GlRenderer(getContext(), this);
    }

    public class GlRenderer extends AExampleRenderer {
        //参考https://blog.csdn.net/gigi_/article/details/53558906
        //创建GLES10
        GLES1X gl2 = new GLES1X();
        public static final int GL_VERTEX_ARRAY = 0x8074;
        public static final int GL_PROJECTION = 0x1701;
        public static final int GL_MODELVIEW = 0x1700;

        public GlRenderer(Context context, AExampleFragment fragment) {
            super(context, fragment);
        }

        @Override
        protected void initScene() {

        }

        @Override
        public void onRenderSurfaceCreated(EGLConfig config, GLES1X gl, int width, int height) {

            //设置背景色,透明度1为完全不透明
            gl2.glClearColor(0f, 0, 0f, 1f);
            //启用客户端状态,启用顶点缓冲区
            gl2.glEnableClientState(GL_VERTEX_ARRAY);
        }

        //表层size改变时，即画面的大小改变时调用
        @Override
        public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
            //设置视口,输出画面的区域,在控件的什么区域来输出,x,y是左下角坐标
            gl2.glViewport(0, 0, 100, 100);
            float ratio = (float) 100 / (float) 100;

            //矩阵模式,投影矩阵,openGL基于状态机
            gl2.glMatrixMode(GL_PROJECTION);
            //加载单位矩阵
            gl2.glLoadIdentity();
            //平截头体
            gl2.glFrustumf(-1f, 1f, -ratio, ratio, 3, 7);
        }

        //绘图
        @Override
        public void onRenderFrame(GLES1X gl) {
            //清除颜色缓冲区
            gl2.glClear(gl2.GL_COLOR_BUFFER_BIT);
            //模型视图矩阵
            gl2.glMatrixMode(GL_MODELVIEW);
            //操作新矩阵要先清0,加载单位矩阵
            gl2.glLoadIdentity();
            //眼睛放的位置,eyes,eyey,eyez眼球(相机)的坐标
            //centerx,y,z镜头朝向，眼球的观察点
            //upx,upy,upz:指定眼球向上的向量,眼睛正着看
            GLU.gluLookAt(gl2, 0, 0, 5, 0, 0, 0,
                    0, 1, 0);
            //画三角形
            //三角形的坐标
            float[] coords = {
                    0f, 0.5f, 0f,
                    -0.5f, -0.5f, 1f,
                    0.5f, -0.5f, 0f,
            };
            //分配字节缓冲区空间,存放顶点坐标数据,将坐标放在缓冲区中
            ByteBuffer ibb = ByteBuffer.allocateDirect(coords.length * 4);  //直接分配字节的大小
            //设置顺序(本地顺序)
            ibb.order(ByteOrder.nativeOrder());
            //放置顶点坐标数组
            FloatBuffer fbb = ibb.asFloatBuffer();
            fbb.put(coords);
            //定位指针的位置,从该位置开始读取顶点数据
            ibb.position(0);
            //设置绘图的颜色，红色
            gl2.glColor4f(1f, 0f, 0f, 1f);
            //3:3维点,使用三个坐标值表示一个点
            //type:每个点的数据类型
            //stride:0,上,点的跨度
            //ibb:指定顶点缓冲区
            gl2.glVertexPointer(3, gl2.GL_FLOAT, 0, ibb);
            //绘制三角形数组
            gl2.glDrawArrays(gl2.GL_TRIANGLES, 0, 3);   //count以点的数量来算,为3
        }


    }
}
